@thecodeblogs/blog 0.15.5 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/thecodeblogs-blog.mjs +2018 -0
- package/fesm2022/thecodeblogs-blog.mjs.map +1 -0
- package/lib/components/entry-creator/entry-creator.component.d.ts +1 -1
- package/lib/components/entry-renderer/entry-renderer.component.d.ts +1 -1
- package/lib/components/entry-renderer-wrapper/entry-renderer-wrapper.component.d.ts +1 -1
- package/lib/components/entry-selector-dialog/entry-selector-dialog.component.d.ts +1 -1
- package/lib/components/entry-summary/entry-summary.component.d.ts +1 -1
- package/lib/components/json-renderer/json-renderer.component.d.ts +1 -1
- package/lib/components/landing-page/landing-page.component.d.ts +1 -1
- package/lib/components/main/main.component.d.ts +1 -1
- package/lib/components/media-upload-modal/media-upload-modal.component.d.ts +4 -2
- package/lib/components/outline-view/outline-view.component.d.ts +1 -1
- package/lib/components/schedule-publish-dialog/schedule-publish-dialog.component.d.ts +1 -1
- package/lib/components/side-navigation/side-navigation.component.d.ts +1 -1
- package/lib/components/static-html/static-html.component.d.ts +1 -1
- package/lib/core.module.d.ts +38 -39
- package/lib/pipes/LinkyPipe.d.ts +1 -1
- package/lib/pipes/TimeAgoPipe.d.ts +1 -1
- package/package.json +22 -26
- package/esm2020/lib/components/entry-creator/entry-creator.component.mjs +0 -341
- package/esm2020/lib/components/entry-renderer/entry-renderer.component.mjs +0 -108
- package/esm2020/lib/components/entry-renderer-wrapper/entry-renderer-wrapper.component.mjs +0 -75
- package/esm2020/lib/components/entry-selector-dialog/entry-selector-dialog-data.mjs +0 -3
- package/esm2020/lib/components/entry-selector-dialog/entry-selector-dialog.component.mjs +0 -54
- package/esm2020/lib/components/entry-summary/entry-summary.component.mjs +0 -28
- package/esm2020/lib/components/json-renderer/json-renderer.component.mjs +0 -26
- package/esm2020/lib/components/landing-page/landing-page.component.mjs +0 -35
- package/esm2020/lib/components/main/main.component.mjs +0 -56
- package/esm2020/lib/components/media-upload-modal/media-upload-modal.component.mjs +0 -160
- package/esm2020/lib/components/outline-view/outline-view.component.mjs +0 -38
- package/esm2020/lib/components/schedule-publish-dialog/schedule-publish-dialog-data.mjs +0 -3
- package/esm2020/lib/components/schedule-publish-dialog/schedule-publish-dialog.component.mjs +0 -33
- package/esm2020/lib/components/side-navigation/side-navigation.component.mjs +0 -230
- package/esm2020/lib/components/static-html/static-html.component.mjs +0 -28
- package/esm2020/lib/core.module.mjs +0 -213
- package/esm2020/lib/data/base.mjs +0 -7
- package/esm2020/lib/data/content-type.mjs +0 -10
- package/esm2020/lib/data/content.mjs +0 -5
- package/esm2020/lib/data/core-event-type.enum.mjs +0 -7
- package/esm2020/lib/data/core-event.mjs +0 -7
- package/esm2020/lib/data/entry.mjs +0 -79
- package/esm2020/lib/data/guid.mjs +0 -12
- package/esm2020/lib/data/identity.mjs +0 -2
- package/esm2020/lib/data/list-response.mjs +0 -3
- package/esm2020/lib/data/section.mjs +0 -11
- package/esm2020/lib/data/tag.mjs +0 -7
- package/esm2020/lib/data/visitor-profile.mjs +0 -3
- package/esm2020/lib/pipes/LinkyPipe.mjs +0 -15
- package/esm2020/lib/pipes/TimeAgoPipe.mjs +0 -100
- package/esm2020/lib/routing/routes.mjs +0 -25
- package/esm2020/lib/services/analytics/interaction.service.mjs +0 -20
- package/esm2020/lib/services/analytics/view.service.mjs +0 -20
- package/esm2020/lib/services/comment.service.mjs +0 -28
- package/esm2020/lib/services/django-rest-framework-endpoint.service.mjs +0 -50
- package/esm2020/lib/services/entry.service.mjs +0 -106
- package/esm2020/lib/services/identity.service.mjs +0 -20
- package/esm2020/lib/services/interaction.mjs +0 -3
- package/esm2020/lib/services/prism.service.mjs +0 -39
- package/esm2020/lib/services/static-html.service.mjs +0 -22
- package/esm2020/lib/services/tag.service.mjs +0 -33
- package/esm2020/lib/services/upload.mjs +0 -3
- package/esm2020/lib/services/upload.service.mjs +0 -22
- package/esm2020/lib/services/view.mjs +0 -3
- package/esm2020/lib/services/visitor-profile.service.mjs +0 -35
- package/esm2020/public-api.mjs +0 -45
- package/esm2020/thecodeblogs-blog.mjs +0 -5
- package/fesm2015/thecodeblogs-blog.mjs +0 -1942
- package/fesm2015/thecodeblogs-blog.mjs.map +0 -1
- package/fesm2020/thecodeblogs-blog.mjs +0 -1936
- package/fesm2020/thecodeblogs-blog.mjs.map +0 -1
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import { Component, HostListener, Input } from '@angular/core';
|
|
2
|
-
import { FileUploader } from 'ng2-file-upload';
|
|
3
|
-
import { UploadService } from '../../services/upload.service';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@angular/material/dialog";
|
|
6
|
-
import * as i2 from "../../services/upload.service";
|
|
7
|
-
import * as i3 from "@angular/common";
|
|
8
|
-
import * as i4 from "@angular/material/button";
|
|
9
|
-
import * as i5 from "@angular/material/divider";
|
|
10
|
-
import * as i6 from "@fortawesome/angular-fontawesome";
|
|
11
|
-
import * as i7 from "ng2-file-upload";
|
|
12
|
-
export class MediaUploadModalComponent {
|
|
13
|
-
static getCookie(name) {
|
|
14
|
-
const ca = document.cookie.split(';');
|
|
15
|
-
const caLen = ca.length;
|
|
16
|
-
const cookieName = `${name}=`;
|
|
17
|
-
let c;
|
|
18
|
-
for (let i = 0; i < caLen; i += 1) {
|
|
19
|
-
c = ca[i].replace(/^\s+/g, '');
|
|
20
|
-
if (c.indexOf(cookieName) === 0) {
|
|
21
|
-
return c.substring(cookieName.length, c.length);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return '';
|
|
25
|
-
}
|
|
26
|
-
constructor(dialogRef, uploadService) {
|
|
27
|
-
this.dialogRef = dialogRef;
|
|
28
|
-
this.uploadService = uploadService;
|
|
29
|
-
this.allowedMimeTypes = [
|
|
30
|
-
'image/jpeg',
|
|
31
|
-
'image/gif',
|
|
32
|
-
'image/png',
|
|
33
|
-
'image/jpg',
|
|
34
|
-
'video/mp4',
|
|
35
|
-
'video/webm',
|
|
36
|
-
'video/ogg',
|
|
37
|
-
];
|
|
38
|
-
this.uploadUrlKey = 'path_to_file';
|
|
39
|
-
this.uploading = false;
|
|
40
|
-
}
|
|
41
|
-
pollForCompletion() {
|
|
42
|
-
this.uploadService.get(this.uploadId).subscribe((response) => {
|
|
43
|
-
if (response.processed) {
|
|
44
|
-
this.imgLink = response[this.uploadUrlKey];
|
|
45
|
-
this.mimeType = response.mime_type;
|
|
46
|
-
clearInterval(this.poller);
|
|
47
|
-
this.poller = null;
|
|
48
|
-
this.uploading = false;
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
ngOnInit() {
|
|
53
|
-
this.uploader = new FileUploader({
|
|
54
|
-
url: UploadService.upload_endpoint,
|
|
55
|
-
itemAlias: 'file',
|
|
56
|
-
authToken: '',
|
|
57
|
-
headers: [
|
|
58
|
-
{ name: 'X-CSRFToken', value: MediaUploadModalComponent.getCookie('csrftoken') },
|
|
59
|
-
],
|
|
60
|
-
additionalParameter: { csrf_token: MediaUploadModalComponent.getCookie('csrftoken') },
|
|
61
|
-
removeAfterUpload: true,
|
|
62
|
-
allowedMimeType: this.allowedMimeTypes,
|
|
63
|
-
});
|
|
64
|
-
this.uploader.onCompleteItem = (item, response) => {
|
|
65
|
-
const responseObj = JSON.parse(response);
|
|
66
|
-
this.uploadId = responseObj.id;
|
|
67
|
-
this.poller = setInterval(this.pollForCompletion.bind(this), 2000);
|
|
68
|
-
};
|
|
69
|
-
this.uploader.onWhenAddingFileFailed = (item, filter, options) => {
|
|
70
|
-
this.error = 'This file is not a supported mimetype.';
|
|
71
|
-
this.uploading = false;
|
|
72
|
-
};
|
|
73
|
-
if (this.file) {
|
|
74
|
-
this.uploader.addToQueue([this.file]);
|
|
75
|
-
this.uploader.uploadAll();
|
|
76
|
-
this.uploading = true;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
onFileSelected(e) {
|
|
80
|
-
this.uploader.uploadAll();
|
|
81
|
-
this.uploading = true;
|
|
82
|
-
}
|
|
83
|
-
buildHost(url) {
|
|
84
|
-
return location.protocol + '//' + location.hostname + (location.port ? ':' + location.port : '') + url;
|
|
85
|
-
}
|
|
86
|
-
close() {
|
|
87
|
-
this.dialogRef.close();
|
|
88
|
-
}
|
|
89
|
-
ngOnDestroy() {
|
|
90
|
-
if (this.socketSub) {
|
|
91
|
-
this.socketSub.complete();
|
|
92
|
-
this.socketSub = null;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
blobToFile(theBlob, fileName) {
|
|
96
|
-
// A Blob() is almost a File() - it's just missing the two properties below which we will add
|
|
97
|
-
theBlob.lastModifiedDate = new Date();
|
|
98
|
-
theBlob.name = fileName;
|
|
99
|
-
return theBlob;
|
|
100
|
-
}
|
|
101
|
-
onPaste(e) {
|
|
102
|
-
if (e instanceof ClipboardEvent) {
|
|
103
|
-
const files = e.clipboardData.files;
|
|
104
|
-
if (files) {
|
|
105
|
-
if (files.length < 1) {
|
|
106
|
-
// const items = e.clipboardData.items;
|
|
107
|
-
// for(let i = 0; i < items.length; i++) {
|
|
108
|
-
// const item = items[i];
|
|
109
|
-
// item.getAsString((text) => {
|
|
110
|
-
// try {
|
|
111
|
-
// const url = new URL(text);
|
|
112
|
-
// if(url) {
|
|
113
|
-
// fetch(text)
|
|
114
|
-
// .then(res => res.blob()) // Gets the response and returns it as a blob
|
|
115
|
-
// .then(blob => {
|
|
116
|
-
// const file = this.blobToFile(blob, 'web-created')
|
|
117
|
-
// this.uploader.addToQueue([file])
|
|
118
|
-
// this.uploader.uploadAll();
|
|
119
|
-
// this.uploading = true;
|
|
120
|
-
// });
|
|
121
|
-
// }
|
|
122
|
-
// } catch(e) {
|
|
123
|
-
//
|
|
124
|
-
// }
|
|
125
|
-
// });
|
|
126
|
-
// }
|
|
127
|
-
}
|
|
128
|
-
else if (files.length > 1) {
|
|
129
|
-
console.log('Multiple files detected');
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
for (let i = 0; i < files.length; i++) {
|
|
133
|
-
this.uploader.addToQueue([files[i]]);
|
|
134
|
-
}
|
|
135
|
-
this.uploader.uploadAll();
|
|
136
|
-
this.uploading = true;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
console.log('Stuff not working');
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
MediaUploadModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: MediaUploadModalComponent, deps: [{ token: i1.MatDialogRef }, { token: i2.UploadService }], target: i0.ɵɵFactoryTarget.Component });
|
|
146
|
-
MediaUploadModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: MediaUploadModalComponent, selector: "app-media-upload-modal", inputs: { allowedMimeTypes: "allowedMimeTypes", uploadUrlKey: "uploadUrlKey", file: "file" }, host: { listeners: { "document:paste": "onPaste($event)" } }, ngImport: i0, template: "<h1 mat-dialog-title>Upload an Image</h1>\n<!--<mat-radio-group aria-label=\"Select an option\">-->\n<!-- <mat-radio-button class=\"option\" value=\"unpublished\">Unpublished</mat-radio-button>-->\n<!-- <mat-radio-button class=\"option\" value=\"published\">Published</mat-radio-button>-->\n<!--</mat-radio-group>-->\n<mat-divider class=\"option-list-divider\"></mat-divider>\n<div mat-dialog-content>\n <div *ngIf=\"uploading\">\n <fa-icon [icon]=\"'spinner'\" [spin]=\"true\"></fa-icon>\n </div>\n <ng-container *ngIf=\"!imgLink && !uploading\">\n <h4>Select a File</h4>\n <div class=\"input-group\">\n <div class=\"form-group\">\n <!-- <label for=\"import_file\">Choose File</label>-->\n <input type=\"file\" id=\"import_file\"\n *ngIf=\"uploader.queue.length==0 && !uploading\"\n ng2FileSelect\n [uploader]=\"uploader\"\n (onFileSelected)=\"onFileSelected($event)\"\n >\n </div>\n </div>\n <br>\n <h3>Paste a File</h3>\n <p>You can use the paste command to paste any image here</p>\n </ng-container>\n <div *ngIf=\"imgLink\">\n <img *ngIf=\"imgLink\" [src]=\"imgLink\"/>\n </div>\n <div *ngIf=\"error\">\n <div class=\"alert alert-danger\">\n {{error}}\n </div>\n </div>\n</div>\n<div mat-dialog-actions>\n <button mat-button [disabled]=\"!imgLink || uploading\" (click)=\"close()\">Attach</button>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i6.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "directive", type: i7.FileSelectDirective, selector: "[ng2FileSelect]", inputs: ["uploader"], outputs: ["onFileSelected"] }] });
|
|
147
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: MediaUploadModalComponent, decorators: [{
|
|
148
|
-
type: Component,
|
|
149
|
-
args: [{ selector: 'app-media-upload-modal', template: "<h1 mat-dialog-title>Upload an Image</h1>\n<!--<mat-radio-group aria-label=\"Select an option\">-->\n<!-- <mat-radio-button class=\"option\" value=\"unpublished\">Unpublished</mat-radio-button>-->\n<!-- <mat-radio-button class=\"option\" value=\"published\">Published</mat-radio-button>-->\n<!--</mat-radio-group>-->\n<mat-divider class=\"option-list-divider\"></mat-divider>\n<div mat-dialog-content>\n <div *ngIf=\"uploading\">\n <fa-icon [icon]=\"'spinner'\" [spin]=\"true\"></fa-icon>\n </div>\n <ng-container *ngIf=\"!imgLink && !uploading\">\n <h4>Select a File</h4>\n <div class=\"input-group\">\n <div class=\"form-group\">\n <!-- <label for=\"import_file\">Choose File</label>-->\n <input type=\"file\" id=\"import_file\"\n *ngIf=\"uploader.queue.length==0 && !uploading\"\n ng2FileSelect\n [uploader]=\"uploader\"\n (onFileSelected)=\"onFileSelected($event)\"\n >\n </div>\n </div>\n <br>\n <h3>Paste a File</h3>\n <p>You can use the paste command to paste any image here</p>\n </ng-container>\n <div *ngIf=\"imgLink\">\n <img *ngIf=\"imgLink\" [src]=\"imgLink\"/>\n </div>\n <div *ngIf=\"error\">\n <div class=\"alert alert-danger\">\n {{error}}\n </div>\n </div>\n</div>\n<div mat-dialog-actions>\n <button mat-button [disabled]=\"!imgLink || uploading\" (click)=\"close()\">Attach</button>\n</div>\n" }]
|
|
150
|
-
}], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: i2.UploadService }]; }, propDecorators: { allowedMimeTypes: [{
|
|
151
|
-
type: Input
|
|
152
|
-
}], uploadUrlKey: [{
|
|
153
|
-
type: Input
|
|
154
|
-
}], file: [{
|
|
155
|
-
type: Input
|
|
156
|
-
}], onPaste: [{
|
|
157
|
-
type: HostListener,
|
|
158
|
-
args: ['document:paste', ['$event']]
|
|
159
|
-
}] } });
|
|
160
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVkaWEtdXBsb2FkLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9jb21wb25lbnRzL21lZGlhLXVwbG9hZC1tb2RhbC9tZWRpYS11cGxvYWQtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2NvbXBvbmVudHMvbWVkaWEtdXBsb2FkLW1vZGFsL21lZGlhLXVwbG9hZC1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUk3QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sK0JBQStCLENBQUM7Ozs7Ozs7OztBQU81RCxNQUFNLE9BQU8seUJBQXlCO0lBeUJsQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQVk7UUFDekIsTUFBTSxFQUFFLEdBQWtCLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sS0FBSyxHQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDaEMsTUFBTSxVQUFVLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUM5QixJQUFJLENBQVMsQ0FBQztRQUVkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMvQixDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFB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QUE2RjtvQkFDN0Ysc0NBQXNDO29CQUN0Qyw0RUFBNEU7b0JBQzVFLDJEQUEyRDtvQkFDM0QscURBQXFEO29CQUNyRCxpREFBaUQ7b0JBQ2pELDBCQUEwQjtvQkFDMUIsZ0JBQWdCO29CQUNoQix1QkFBdUI7b0JBQ3ZCLEVBQUU7b0JBQ0YsWUFBWTtvQkFDWixVQUFVO29CQUNWLElBQUk7aUJBQ1A7cUJBQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDekIsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO2lCQUMxQztxQkFBTTtvQkFDSCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUN4QztvQkFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUMxQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztpQkFDekI7YUFDSjtpQkFBTTtnQkFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7YUFDcEM7U0FDSjtJQUNMLENBQUM7O3NIQWpLUSx5QkFBeUI7MEdBQXpCLHlCQUF5QiwwTkNadEMsOGpEQXVDQTsyRkQzQmEseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNJLHdCQUF3QjsrSEFNekIsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQVVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBU0csSUFBSTtzQkFBWixLQUFLO2dCQXFHTixPQUFPO3NCQUROLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25Jbml0LCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGaWxlVXBsb2FkZXJ9IGZyb20gJ25nMi1maWxlLXVwbG9hZCc7XG5pbXBvcnQge01hdERpYWxvZ1JlZn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHtEamFuZ29SZXN0RnJhbWV3b3JrRW5kcG9pbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kamFuZ28tcmVzdC1mcmFtZXdvcmstZW5kcG9pbnQuc2VydmljZSc7XG5pbXBvcnQge1VwbG9hZFNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3VwbG9hZC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtbWVkaWEtdXBsb2FkLW1vZGFsJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbWVkaWEtdXBsb2FkLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9tZWRpYS11cGxvYWQtbW9kYWwuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIE1lZGlhVXBsb2FkTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBASW5wdXQoKSBhbGxvd2VkTWltZVR5cGVzID0gW1xuICAgICAgICAgICAgICAgICdpbWFnZS9qcGVnJyxcbiAgICAgICAgICAgICAgICAnaW1hZ2UvZ2lmJyxcbiAgICAgICAgICAgICAgICAnaW1hZ2UvcG5nJyxcbiAgICAgICAgICAgICAgICAnaW1hZ2UvanBnJyxcbiAgICAgICAgICAgICAgICAndmlkZW8vbXA0JyxcbiAgICAgICAgICAgICAgICAndmlkZW8vd2VibScsXG4gICAgICAgICAgICAgICAgJ3ZpZGVvL29nZycsXG4gICAgXTtcblxuICAgIEBJbnB1dCgpIHVwbG9hZFVybEtleSA9ICdwYXRoX3RvX2ZpbGUnO1xuXG4gICAgaW1nTGluaztcbiAgICBtaW1lVHlwZTtcbiAgICBzb2NrZXRTdWI7XG4gICAgZXJyb3I7XG4gICAgcHVibGljIHVwbG9hZGVyOiBGaWxlVXBsb2FkZXI7XG4gICAgdXBsb2FkSWQ7XG4gICAgdXBsb2FkaW5nID0gZmFsc2U7XG4gICAgQElucHV0KCkgZmlsZTtcblxuICAgIHBvbGxlcjtcblxuICAgIHN0YXRpYyBnZXRDb29raWUobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGNhOiBBcnJheTxzdHJpbmc+ID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7XG4gICAgICAgIGNvbnN0IGNhTGVuOiBudW1iZXIgPSBjYS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNvb2tpZU5hbWUgPSBgJHtuYW1lfT1gO1xuICAgICAgICBsZXQgYzogc3RyaW5nO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FMZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgYyA9IGNhW2ldLnJlcGxhY2UoL15cXHMrL2csICcnKTtcbiAgICAgICAgICAgIGlmIChjLmluZGV4T2YoY29va2llTmFtZSkgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYy5zdWJzdHJpbmcoY29va2llTmFtZS5sZW5ndGgsIGMubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxNZWRpYVVwbG9hZE1vZGFsQ29tcG9uZW50PixcbiAgICAgICAgcHJpdmF0ZSB1cGxvYWRTZXJ2aWNlOiBVcGxvYWRTZXJ2aWNlXG4gICAgKSB7XG4gICAgfVxuXG5cbiAgICBwb2xsRm9yQ29tcGxldGlvbigpIHtcbiAgICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmdldCh0aGlzLnVwbG9hZElkKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UucHJvY2Vzc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbWdMaW5rID0gcmVzcG9uc2VbdGhpcy51cGxvYWRVcmxLZXldO1xuICAgICAgICAgICAgICAgIHRoaXMubWltZVR5cGUgPSByZXNwb25zZS5taW1lX3R5cGU7XG4gICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnBvbGxlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5wb2xsZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgICAgICAgdGhpcy51cGxvYWRlciA9IG5ldyBGaWxlVXBsb2FkZXIoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdXJsOiBVcGxvYWRTZXJ2aWNlLnVwbG9hZF9lbmRwb2ludCxcbiAgICAgICAgICAgICAgICBpdGVtQWxpYXM6ICdmaWxlJyxcbiAgICAgICAgICAgICAgICBhdXRoVG9rZW46ICcnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAge25hbWU6ICdYLUNTUkZUb2tlbicsIHZhbHVlOiBNZWRpYVVwbG9hZE1vZGFsQ29tcG9uZW50LmdldENvb2tpZSgnY3NyZnRva2VuJyl9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbFBhcmFtZXRlcjoge2NzcmZfdG9rZW46IE1lZGlhVXBsb2FkTW9kYWxDb21wb25lbnQuZ2V0Q29va2llKCdjc3JmdG9rZW4nKX0sXG4gICAgICAgICAgICAgICAgcmVtb3ZlQWZ0ZXJVcGxvYWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgYWxsb3dlZE1pbWVUeXBlOiB0aGlzLmFsbG93ZWRNaW1lVHlwZXMsXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy51cGxvYWRlci5vbkNvbXBsZXRlSXRlbSA9IChpdGVtLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VPYmogPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHRoaXMudXBsb2FkSWQgPSByZXNwb25zZU9iai5pZDtcbiAgICAgICAgICAgIHRoaXMucG9sbGVyID0gc2V0SW50ZXJ2YWwodGhpcy5wb2xsRm9yQ29tcGxldGlvbi5iaW5kKHRoaXMpLCAyMDAwKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnVwbG9hZGVyLm9uV2hlbkFkZGluZ0ZpbGVGYWlsZWQgPSAoaXRlbSwgZmlsdGVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVycm9yID0gJ1RoaXMgZmlsZSBpcyBub3QgYSBzdXBwb3J0ZWQgbWltZXR5cGUuJztcbiAgICAgICAgICAgIHRoaXMudXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsZSkge1xuICAgICAgICAgICAgdGhpcy51cGxvYWRlci5hZGRUb1F1ZXVlKFt0aGlzLmZpbGVdKTtcbiAgICAgICAgICAgIHRoaXMudXBsb2FkZXIudXBsb2FkQWxsKCk7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZGluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkZpbGVTZWxlY3RlZChlKSB7XG4gICAgICAgIHRoaXMudXBsb2FkZXIudXBsb2FkQWxsKCk7XG4gICAgICAgIHRoaXMudXBsb2FkaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBidWlsZEhvc3QodXJsKSB7XG4gICAgICAgIHJldHVybiBsb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyBsb2NhdGlvbi5ob3N0bmFtZSArIChsb2NhdGlvbi5wb3J0ID8gJzonICsgbG9jYXRpb24ucG9ydCA6ICcnKSArIHVybDtcbiAgICB9XG5cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc29ja2V0U3ViKSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldFN1Yi5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXRTdWIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmxvYlRvRmlsZSh0aGVCbG9iLCBmaWxlTmFtZSkge1xuICAgICAgICAvLyBBIEJsb2IoKSBpcyBhbG1vc3QgYSBGaWxlKCkgLSBpdCdzIGp1c3QgbWlzc2luZyB0aGUgdHdvIHByb3BlcnRpZXMgYmVsb3cgd2hpY2ggd2Ugd2lsbCBhZGRcbiAgICAgICAgdGhlQmxvYi5sYXN0TW9kaWZpZWREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgdGhlQmxvYi5uYW1lID0gZmlsZU5hbWU7XG4gICAgICAgIHJldHVybiB0aGVCbG9iO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OnBhc3RlJywgWyckZXZlbnQnXSlcbiAgICBvblBhc3RlKGUpIHtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBDbGlwYm9hcmRFdmVudCkge1xuICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBlLmNsaXBib2FyZERhdGEuZmlsZXM7XG4gICAgICAgICAgICBpZiAoZmlsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBpdGVtcyA9IGUuY2xpcGJvYXJkRGF0YS5pdGVtcztcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBpdGVtLmdldEFzU3RyaW5nKCh0ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh0ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgaWYodXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBmZXRjaCh0ZXh0KVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIC50aGVuKHJlcyA9PiByZXMuYmxvYigpKSAvLyBHZXRzIHRoZSByZXNwb25zZSBhbmQgcmV0dXJucyBpdCBhcyBhIGJsb2JcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAudGhlbihibG9iID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IHRoaXMuYmxvYlRvRmlsZShibG9iLCAnd2ViLWNyZWF0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVyLmFkZFRvUXVldWUoW2ZpbGVdKVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVyLnVwbG9hZEFsbCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnTXVsdGlwbGUgZmlsZXMgZGV0ZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVyLmFkZFRvUXVldWUoW2ZpbGVzW2ldXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlci51cGxvYWRBbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1N0dWZmIG5vdCB3b3JraW5nJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8aDEgbWF0LWRpYWxvZy10aXRsZT5VcGxvYWQgYW4gSW1hZ2U8L2gxPlxuPCEtLTxtYXQtcmFkaW8tZ3JvdXAgYXJpYS1sYWJlbD1cIlNlbGVjdCBhbiBvcHRpb25cIj4tLT5cbjwhLS0gICAgPG1hdC1yYWRpby1idXR0b24gY2xhc3M9XCJvcHRpb25cIiB2YWx1ZT1cInVucHVibGlzaGVkXCI+VW5wdWJsaXNoZWQ8L21hdC1yYWRpby1idXR0b24+LS0+XG48IS0tICAgIDxtYXQtcmFkaW8tYnV0dG9uIGNsYXNzPVwib3B0aW9uXCIgdmFsdWU9XCJwdWJsaXNoZWRcIj5QdWJsaXNoZWQ8L21hdC1yYWRpby1idXR0b24+LS0+XG48IS0tPC9tYXQtcmFkaW8tZ3JvdXA+LS0+XG48bWF0LWRpdmlkZXIgY2xhc3M9XCJvcHRpb24tbGlzdC1kaXZpZGVyXCI+PC9tYXQtZGl2aWRlcj5cbjxkaXYgbWF0LWRpYWxvZy1jb250ZW50PlxuICAgIDxkaXYgKm5nSWY9XCJ1cGxvYWRpbmdcIj5cbiAgICAgICAgPGZhLWljb24gW2ljb25dPVwiJ3NwaW5uZXInXCIgW3NwaW5dPVwidHJ1ZVwiPjwvZmEtaWNvbj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWltZ0xpbmsgJiYgIXVwbG9hZGluZ1wiPlxuICAgICAgICA8aDQ+U2VsZWN0IGEgRmlsZTwvaDQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJpbXBvcnRfZmlsZVwiPkNob29zZSBGaWxlPC9sYWJlbD4tLT5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cImltcG9ydF9maWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ1cGxvYWRlci5xdWV1ZS5sZW5ndGg9PTAgJiYgIXVwbG9hZGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgIG5nMkZpbGVTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgW3VwbG9hZGVyXT1cInVwbG9hZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgKG9uRmlsZVNlbGVjdGVkKT1cIm9uRmlsZVNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJyPlxuICAgICAgICA8aDM+UGFzdGUgYSBGaWxlPC9oMz5cbiAgICAgICAgPHA+WW91IGNhbiB1c2UgdGhlIHBhc3RlIGNvbW1hbmQgdG8gcGFzdGUgYW55IGltYWdlIGhlcmU8L3A+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGRpdiAqbmdJZj1cImltZ0xpbmtcIj5cbiAgICAgICAgPGltZyAqbmdJZj1cImltZ0xpbmtcIiBbc3JjXT1cImltZ0xpbmtcIi8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImVycm9yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIj5cbiAgICAgICAgICAgIHt7ZXJyb3J9fVxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFtkaXNhYmxlZF09XCIhaW1nTGluayB8fCB1cGxvYWRpbmdcIiAoY2xpY2spPVwiY2xvc2UoKVwiPkF0dGFjaDwvYnV0dG9uPlxuPC9kaXY+XG4iXX0=
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { Component } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "../../services/entry.service";
|
|
4
|
-
import * as i2 from "@angular/common";
|
|
5
|
-
import * as i3 from "@angular/cdk/drag-drop";
|
|
6
|
-
import * as i4 from "@angular/material/card";
|
|
7
|
-
export class OutlineViewComponent {
|
|
8
|
-
constructor(entryService) {
|
|
9
|
-
this.entryService = entryService;
|
|
10
|
-
this.Math = Math;
|
|
11
|
-
}
|
|
12
|
-
ngOnInit() {
|
|
13
|
-
this.entryService.currentlyEditedEntry.subscribe((entry) => {
|
|
14
|
-
this.entry = entry;
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
sectionDrop(e) {
|
|
18
|
-
const entry = this.entry;
|
|
19
|
-
const diff = e.currentIndex - e.previousIndex;
|
|
20
|
-
entry.sections[e.previousIndex].order = e.currentIndex * 10 + (diff > 0 ? 1 : -1);
|
|
21
|
-
entry.sort();
|
|
22
|
-
this.entryService.currentlyEditedEntry.next(this.entry);
|
|
23
|
-
}
|
|
24
|
-
contentDrop(e, section) {
|
|
25
|
-
const entry = this.entry;
|
|
26
|
-
const diff = e.currentIndex - e.previousIndex;
|
|
27
|
-
section.contents[e.previousIndex].order = e.currentIndex * 10 + (diff > 0 ? 1 : -1);
|
|
28
|
-
entry.sort();
|
|
29
|
-
this.entryService.currentlyEditedEntry.next(this.entry);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
OutlineViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: OutlineViewComponent, deps: [{ token: i1.EntryService }], target: i0.ɵɵFactoryTarget.Component });
|
|
33
|
-
OutlineViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: OutlineViewComponent, selector: "app-outline-view", ngImport: i0, template: "<div *ngIf=\"entry\" class=\"section outline\">\n <h1 *ngIf=\"entry?.sections?.length === 0\">Outline View</h1>\n <div cdkDropList class=\"sections\" (cdkDropListDropped)=\"sectionDrop($event)\">\n <mat-card class=\"card\" cdkDrag *ngFor=\"let section of entry.sections\">\n <h3>Section {{Math.ceil(section.order / 10) + 1}}</h3>\n {{section.subheading}}\n <div cdkDropList class=\"contents\" (cdkDropListDropped)=\"contentDrop($event, section)\">\n <h3>Contents for {{section.subheading}}</h3>\n <div class=\"content-card\" *ngFor=\"let content of section.contents\" cdkDrag>\n <div class=\"content\">{{content.value}}</div>\n <div class=\"content-placeholder\" *cdkDragPlaceholder></div>\n </div>\n </div>\n </mat-card>\n <div class=\"custom-placeholder\" *cdkDragPlaceholder></div>\n </div>\n</div>\n", styles: [".outline{padding:0 20px}.content{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.card,.content-card{margin:4px;cursor:pointer}.content-card:not(:last-child){border-bottom:1px dotted #aaa}.custom-placeholder{background:#ccc;border:dotted 3px #999;transition:transform .25s cubic-bezier(0,0,.2,1);min-height:60px}.content-placeholder{background:#ccc;border:dotted 3px #999;transition:transform .25s cubic-bezier(0,0,.2,1);min-height:30px}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i3.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i3.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "component", type: i4.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }] });
|
|
34
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: OutlineViewComponent, decorators: [{
|
|
35
|
-
type: Component,
|
|
36
|
-
args: [{ selector: 'app-outline-view', template: "<div *ngIf=\"entry\" class=\"section outline\">\n <h1 *ngIf=\"entry?.sections?.length === 0\">Outline View</h1>\n <div cdkDropList class=\"sections\" (cdkDropListDropped)=\"sectionDrop($event)\">\n <mat-card class=\"card\" cdkDrag *ngFor=\"let section of entry.sections\">\n <h3>Section {{Math.ceil(section.order / 10) + 1}}</h3>\n {{section.subheading}}\n <div cdkDropList class=\"contents\" (cdkDropListDropped)=\"contentDrop($event, section)\">\n <h3>Contents for {{section.subheading}}</h3>\n <div class=\"content-card\" *ngFor=\"let content of section.contents\" cdkDrag>\n <div class=\"content\">{{content.value}}</div>\n <div class=\"content-placeholder\" *cdkDragPlaceholder></div>\n </div>\n </div>\n </mat-card>\n <div class=\"custom-placeholder\" *cdkDragPlaceholder></div>\n </div>\n</div>\n", styles: [".outline{padding:0 20px}.content{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.card,.content-card{margin:4px;cursor:pointer}.content-card:not(:last-child){border-bottom:1px dotted #aaa}.custom-placeholder{background:#ccc;border:dotted 3px #999;transition:transform .25s cubic-bezier(0,0,.2,1);min-height:60px}.content-placeholder{background:#ccc;border:dotted 3px #999;transition:transform .25s cubic-bezier(0,0,.2,1);min-height:30px}\n"] }]
|
|
37
|
-
}], ctorParameters: function () { return [{ type: i1.EntryService }]; } });
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0bGluZS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9jb21wb25lbnRzL291dGxpbmUtdmlldy9vdXRsaW5lLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2NvbXBvbmVudHMvb3V0bGluZS12aWV3L291dGxpbmUtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFnQixNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBVXZELE1BQU0sT0FBTyxvQkFBb0I7SUFLN0IsWUFDWSxZQUEwQjtRQUExQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUh0QyxTQUFJLEdBQUcsSUFBSSxDQUFDO0lBS1osQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3ZELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFdBQVcsQ0FBQyxDQUFDO1FBQ1QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDOUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxZQUFZLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsV0FBVyxDQUFDLENBQUMsRUFBRSxPQUFPO1FBQ2xCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDekIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsWUFBWSxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsQ0FBQzs7aUhBOUJRLG9CQUFvQjtxR0FBcEIsb0JBQW9CLHdEQ1ZqQyxrOEJBaUJBOzJGRFBhLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDSSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXQsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7RW50cnl9IGZyb20gJy4uLy4uL2RhdGEvZW50cnknO1xuaW1wb3J0IHtFbnRyeVNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2VudHJ5LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1vdXRsaW5lLXZpZXcnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9vdXRsaW5lLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL291dGxpbmUtdmlldy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE91dGxpbmVWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIGVudHJ5OiBFbnRyeTtcbiAgICBNYXRoID0gTWF0aDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGVudHJ5U2VydmljZTogRW50cnlTZXJ2aWNlXG4gICAgKSB7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuZW50cnlTZXJ2aWNlLmN1cnJlbnRseUVkaXRlZEVudHJ5LnN1YnNjcmliZSgoZW50cnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW50cnkgPSBlbnRyeTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2VjdGlvbkRyb3AoZSkge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cnk7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBlLmN1cnJlbnRJbmRleCAtIGUucHJldmlvdXNJbmRleDtcbiAgICAgICAgZW50cnkuc2VjdGlvbnNbZS5wcmV2aW91c0luZGV4XS5vcmRlciA9IGUuY3VycmVudEluZGV4ICogMTAgKyAoZGlmZiA+IDAgPyAxIDogLTEpO1xuICAgICAgICBlbnRyeS5zb3J0KCk7XG4gICAgICAgIHRoaXMuZW50cnlTZXJ2aWNlLmN1cnJlbnRseUVkaXRlZEVudHJ5Lm5leHQodGhpcy5lbnRyeSk7XG4gICAgfVxuXG4gICAgY29udGVudERyb3AoZSwgc2VjdGlvbikge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cnk7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBlLmN1cnJlbnRJbmRleCAtIGUucHJldmlvdXNJbmRleDtcbiAgICAgICAgc2VjdGlvbi5jb250ZW50c1tlLnByZXZpb3VzSW5kZXhdLm9yZGVyID0gZS5jdXJyZW50SW5kZXggKiAxMCArIChkaWZmID4gMCA/IDEgOiAtMSk7XG4gICAgICAgIGVudHJ5LnNvcnQoKTtcbiAgICAgICAgdGhpcy5lbnRyeVNlcnZpY2UuY3VycmVudGx5RWRpdGVkRW50cnkubmV4dCh0aGlzLmVudHJ5KTtcbiAgICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwiZW50cnlcIiBjbGFzcz1cInNlY3Rpb24gb3V0bGluZVwiPlxuICAgIDxoMSAqbmdJZj1cImVudHJ5Py5zZWN0aW9ucz8ubGVuZ3RoID09PSAwXCI+T3V0bGluZSBWaWV3PC9oMT5cbiAgICA8ZGl2IGNka0Ryb3BMaXN0IGNsYXNzPVwic2VjdGlvbnNcIiAoY2RrRHJvcExpc3REcm9wcGVkKT1cInNlY3Rpb25Ecm9wKCRldmVudClcIj5cbiAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwiY2FyZFwiIGNka0RyYWcgKm5nRm9yPVwibGV0IHNlY3Rpb24gb2YgZW50cnkuc2VjdGlvbnNcIj5cbiAgICAgICAgICAgIDxoMz5TZWN0aW9uIHt7TWF0aC5jZWlsKHNlY3Rpb24ub3JkZXIgLyAxMCkgKyAxfX08L2gzPlxuICAgICAgICAgICAge3tzZWN0aW9uLnN1YmhlYWRpbmd9fVxuICAgICAgICAgICAgPGRpdiBjZGtEcm9wTGlzdCBjbGFzcz1cImNvbnRlbnRzXCIgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJjb250ZW50RHJvcCgkZXZlbnQsIHNlY3Rpb24pXCI+XG4gICAgICAgICAgICAgICAgPGgzPkNvbnRlbnRzIGZvciB7e3NlY3Rpb24uc3ViaGVhZGluZ319PC9oMz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1jYXJkXCIgKm5nRm9yPVwibGV0IGNvbnRlbnQgb2Ygc2VjdGlvbi5jb250ZW50c1wiIGNka0RyYWc+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+e3tjb250ZW50LnZhbHVlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtcGxhY2Vob2xkZXJcIiAqY2RrRHJhZ1BsYWNlaG9sZGVyPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tcGxhY2Vob2xkZXJcIiAqY2RrRHJhZ1BsYWNlaG9sZGVyPjwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export class SchedulePublishDialogData {
|
|
2
|
-
}
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUtcHVibGlzaC1kaWFsb2ctZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9jb21wb25lbnRzL3NjaGVkdWxlLXB1Ymxpc2gtZGlhbG9nL3NjaGVkdWxlLXB1Ymxpc2gtZGlhbG9nLWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLHlCQUF5QjtDQUNyQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBTY2hlZHVsZVB1Ymxpc2hEaWFsb2dEYXRhIHtcbn1cbiJdfQ==
|
package/esm2020/lib/components/schedule-publish-dialog/schedule-publish-dialog.component.mjs
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { Component, Inject } from '@angular/core';
|
|
2
|
-
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/material/dialog";
|
|
5
|
-
import * as i2 from "@angular/material/button";
|
|
6
|
-
import * as i3 from "@angular/material/input";
|
|
7
|
-
import * as i4 from "@angular/material/form-field";
|
|
8
|
-
import * as i5 from "@angular/material/datepicker";
|
|
9
|
-
import * as i6 from "ngx-material-timepicker";
|
|
10
|
-
import * as i7 from "./schedule-publish-dialog-data";
|
|
11
|
-
export class SchedulePublishDialogComponent {
|
|
12
|
-
constructor(dialogRef, data) {
|
|
13
|
-
this.dialogRef = dialogRef;
|
|
14
|
-
this.data = data;
|
|
15
|
-
}
|
|
16
|
-
ngOnInit() {
|
|
17
|
-
}
|
|
18
|
-
onNoClick() {
|
|
19
|
-
}
|
|
20
|
-
onYesClick() {
|
|
21
|
-
this.dialogRef.close('test');
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
SchedulePublishDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: SchedulePublishDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
|
|
25
|
-
SchedulePublishDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: SchedulePublishDialogComponent, selector: "lib-schedule-publish-dialog", ngImport: i0, template: "<h1 mat-dialog-title>Select a Date and Time to Schedule This Post</h1>\n<!--<mat-radio-group aria-label=\"Select an option\">-->\n<!-- <mat-radio-button class=\"option\" value=\"unpublished\">Unpublished</mat-radio-button>-->\n<!-- <mat-radio-button class=\"option\" value=\"published\">Published</mat-radio-button>-->\n<!--</mat-radio-group>-->\n<p>Date</p>\n<mat-form-field appearance=\"fill\">\n <mat-label>Choose a date</mat-label>\n <input matInput [matDatepicker]=\"picker\">\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n</mat-form-field>\n<p>Time</p>\n<input [ngxTimepicker]=\"timepicker\" readonly>\n<ngx-material-timepicker #timepicker></ngx-material-timepicker>\n<div mat-dialog-actions>\n <button mat-button (click)=\"onNoClick()\">Cancel</button>\n <button mat-button (click)=\"onYesClick()\" cdkFocusInitial>Schedule Publish</button>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i5.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i5.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i5.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i6.NgxMaterialTimepickerComponent, selector: "ngx-material-timepicker", inputs: ["ESC", "hoursOnly", "ngxMaterialTimepickerTheme", "format", "minutesGap", "cancelBtnTmpl", "editableHintTmpl", "confirmBtnTmpl", "enableKeyboardInput", "preventOverlayClick", "disableAnimation", "appendToInput", "defaultTime", "timepickerClass", "theme", "min", "max"], outputs: ["timeSet", "opened", "closed", "hourSelected", "timeChanged"] }, { kind: "directive", type: i6.TimepickerDirective, selector: "[ngxTimepicker]", inputs: ["format", "value", "min", "max", "ngxTimepicker", "disabled", "disableClick"] }] });
|
|
26
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: SchedulePublishDialogComponent, decorators: [{
|
|
27
|
-
type: Component,
|
|
28
|
-
args: [{ selector: 'lib-schedule-publish-dialog', template: "<h1 mat-dialog-title>Select a Date and Time to Schedule This Post</h1>\n<!--<mat-radio-group aria-label=\"Select an option\">-->\n<!-- <mat-radio-button class=\"option\" value=\"unpublished\">Unpublished</mat-radio-button>-->\n<!-- <mat-radio-button class=\"option\" value=\"published\">Published</mat-radio-button>-->\n<!--</mat-radio-group>-->\n<p>Date</p>\n<mat-form-field appearance=\"fill\">\n <mat-label>Choose a date</mat-label>\n <input matInput [matDatepicker]=\"picker\">\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n</mat-form-field>\n<p>Time</p>\n<input [ngxTimepicker]=\"timepicker\" readonly>\n<ngx-material-timepicker #timepicker></ngx-material-timepicker>\n<div mat-dialog-actions>\n <button mat-button (click)=\"onNoClick()\">Cancel</button>\n <button mat-button (click)=\"onYesClick()\" cdkFocusInitial>Schedule Publish</button>\n</div>\n" }]
|
|
29
|
-
}], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: i7.SchedulePublishDialogData, decorators: [{
|
|
30
|
-
type: Inject,
|
|
31
|
-
args: [MAT_DIALOG_DATA]
|
|
32
|
-
}] }]; } });
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUtcHVibGlzaC1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2NvbXBvbmVudHMvc2NoZWR1bGUtcHVibGlzaC1kaWFsb2cvc2NoZWR1bGUtcHVibGlzaC1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2NvbXBvbmVudHMvc2NoZWR1bGUtcHVibGlzaC1kaWFsb2cvc2NoZWR1bGUtcHVibGlzaC1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFlLGVBQWUsRUFBQyxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7Ozs7QUFRdkUsTUFBTSxPQUFPLDhCQUE4QjtJQUV2QyxZQUNXLFNBQXVELEVBQzlCLElBQStCO1FBRHhELGNBQVMsR0FBVCxTQUFTLENBQThDO1FBQzlCLFNBQUksR0FBSixJQUFJLENBQTJCO0lBQy9ELENBQUM7SUFFTCxRQUFRO0lBQ1IsQ0FBQztJQUVELFNBQVM7SUFDVCxDQUFDO0lBRUQsVUFBVTtRQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7OzJIQWZRLDhCQUE4Qiw4Q0FJM0IsZUFBZTsrR0FKbEIsOEJBQThCLG1FQ1QzQyx1N0JBbUJBOzJGRFZhLDhCQUE4QjtrQkFMMUMsU0FBUzsrQkFDSSw2QkFBNkI7OzBCQVFsQyxNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHtTY2hlZHVsZVB1Ymxpc2hEaWFsb2dEYXRhfSBmcm9tICcuL3NjaGVkdWxlLXB1Ymxpc2gtZGlhbG9nLWRhdGEnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1zY2hlZHVsZS1wdWJsaXNoLWRpYWxvZycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NjaGVkdWxlLXB1Ymxpc2gtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zY2hlZHVsZS1wdWJsaXNoLWRpYWxvZy5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU2NoZWR1bGVQdWJsaXNoRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8U2NoZWR1bGVQdWJsaXNoRGlhbG9nQ29tcG9uZW50PixcbiAgICAgICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBTY2hlZHVsZVB1Ymxpc2hEaWFsb2dEYXRhLFxuICAgICkgeyB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB9XG5cbiAgICBvbk5vQ2xpY2soKTogdm9pZCB7XG4gICAgfVxuXG4gICAgb25ZZXNDbGljaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoJ3Rlc3QnKTtcbiAgICB9XG59XG4iLCI8aDEgbWF0LWRpYWxvZy10aXRsZT5TZWxlY3QgYSBEYXRlIGFuZCBUaW1lIHRvIFNjaGVkdWxlIFRoaXMgUG9zdDwvaDE+XG48IS0tPG1hdC1yYWRpby1ncm91cCBhcmlhLWxhYmVsPVwiU2VsZWN0IGFuIG9wdGlvblwiPi0tPlxuPCEtLSAgICA8bWF0LXJhZGlvLWJ1dHRvbiBjbGFzcz1cIm9wdGlvblwiIHZhbHVlPVwidW5wdWJsaXNoZWRcIj5VbnB1Ymxpc2hlZDwvbWF0LXJhZGlvLWJ1dHRvbj4tLT5cbjwhLS0gICAgPG1hdC1yYWRpby1idXR0b24gY2xhc3M9XCJvcHRpb25cIiB2YWx1ZT1cInB1Ymxpc2hlZFwiPlB1Ymxpc2hlZDwvbWF0LXJhZGlvLWJ1dHRvbj4tLT5cbjwhLS08L21hdC1yYWRpby1ncm91cD4tLT5cbjxwPkRhdGU8L3A+XG48bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIj5cbiAgPG1hdC1sYWJlbD5DaG9vc2UgYSBkYXRlPC9tYXQtbGFiZWw+XG4gIDxpbnB1dCBtYXRJbnB1dCBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIj5cbiAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cbjwvbWF0LWZvcm0tZmllbGQ+XG48cD5UaW1lPC9wPlxuPGlucHV0IFtuZ3hUaW1lcGlja2VyXT1cInRpbWVwaWNrZXJcIiByZWFkb25seT5cbjxuZ3gtbWF0ZXJpYWwtdGltZXBpY2tlciAjdGltZXBpY2tlcj48L25neC1tYXRlcmlhbC10aW1lcGlja2VyPlxuPGRpdiBtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJvbk5vQ2xpY2soKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwib25ZZXNDbGljaygpXCIgY2RrRm9jdXNJbml0aWFsPlNjaGVkdWxlIFB1Ymxpc2g8L2J1dHRvbj5cbjwvZGl2PlxuIl19
|
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
import { Component, EventEmitter, ViewChild } from '@angular/core';
|
|
2
|
-
import { trigger, state, style, animate, transition } from '@angular/animations';
|
|
3
|
-
import { FormControl } from '@angular/forms';
|
|
4
|
-
import { filter } from 'lodash';
|
|
5
|
-
import { map } from 'lodash';
|
|
6
|
-
import { debounceTime } from 'rxjs/operators';
|
|
7
|
-
import { Entry } from '../../data/entry';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "../../services/entry.service";
|
|
10
|
-
import * as i2 from "@angular/router";
|
|
11
|
-
import * as i3 from "../../services/identity.service";
|
|
12
|
-
import * as i4 from "@angular/common";
|
|
13
|
-
import * as i5 from "@angular/forms";
|
|
14
|
-
import * as i6 from "@angular/material/input";
|
|
15
|
-
import * as i7 from "@angular/material/form-field";
|
|
16
|
-
import * as i8 from "@angular/material/list";
|
|
17
|
-
import * as i9 from "@angular/material/progress-spinner";
|
|
18
|
-
export class SideNavigationComponent {
|
|
19
|
-
constructor(entryService, router, identityService, renderer) {
|
|
20
|
-
this.entryService = entryService;
|
|
21
|
-
this.router = router;
|
|
22
|
-
this.identityService = identityService;
|
|
23
|
-
this.renderer = renderer;
|
|
24
|
-
this.state = 'out';
|
|
25
|
-
this.response = null;
|
|
26
|
-
this.debounceTimeout = 200;
|
|
27
|
-
this.loading = true;
|
|
28
|
-
this.entries = [];
|
|
29
|
-
this.entriesByMonthAndYear = [];
|
|
30
|
-
this.searchTerm = "";
|
|
31
|
-
this.doSearch = new EventEmitter();
|
|
32
|
-
this.searchControl = new FormControl('');
|
|
33
|
-
}
|
|
34
|
-
ngOnInit() {
|
|
35
|
-
this.doSearch.pipe(debounceTime(this.debounceTimeout)).subscribe((result) => {
|
|
36
|
-
this.searchEntries(result);
|
|
37
|
-
});
|
|
38
|
-
this.identityService.getMe().subscribe((identity) => {
|
|
39
|
-
this.identity = identity;
|
|
40
|
-
}, (err) => {
|
|
41
|
-
this.identity = null;
|
|
42
|
-
});
|
|
43
|
-
this.getEntries();
|
|
44
|
-
}
|
|
45
|
-
getMore() {
|
|
46
|
-
this.getEntriesWithUrl(this.response.next, false);
|
|
47
|
-
}
|
|
48
|
-
getEntriesWithUrl(url, wipe = true) {
|
|
49
|
-
this.loading = true;
|
|
50
|
-
this.entryService.getListByUrl(url).subscribe((response) => {
|
|
51
|
-
this.response = response;
|
|
52
|
-
this.entries = this.entries.concat(map(response.results, (result) => {
|
|
53
|
-
return { id: result.id, entry: new Entry(result) };
|
|
54
|
-
}));
|
|
55
|
-
this.organizeEntries(wipe);
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
organizeEntries(wipe = true) {
|
|
59
|
-
if (wipe) {
|
|
60
|
-
this.state = 'out';
|
|
61
|
-
}
|
|
62
|
-
let organizeEntriesFn = () => {
|
|
63
|
-
if (wipe) {
|
|
64
|
-
this.entriesByMonthAndYear = [];
|
|
65
|
-
}
|
|
66
|
-
let newEntries = JSON.parse(JSON.stringify(this.entriesByMonthAndYear));
|
|
67
|
-
for (const entryWrapper of this.entries) {
|
|
68
|
-
const entry = entryWrapper.entry;
|
|
69
|
-
const create_date = new Date(entry.create_date);
|
|
70
|
-
const month = create_date.getMonth();
|
|
71
|
-
const year = create_date.getFullYear();
|
|
72
|
-
const key = month + '/' + year;
|
|
73
|
-
const sort_index = (year * 100) + month;
|
|
74
|
-
const containers = filter(newEntries, (entryContainer) => entryContainer.month_year === key);
|
|
75
|
-
if (containers.length > 0) {
|
|
76
|
-
const container = containers[0];
|
|
77
|
-
const entriesWithId = filter(container.entries, (e) => e.id === entryWrapper.entry.id);
|
|
78
|
-
if (entriesWithId.length === 0) {
|
|
79
|
-
container.entries.push(entry);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
const newContainer = { month_year: key, month_year_number: sort_index, entries: [entry] };
|
|
84
|
-
newEntries.push(newContainer);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
newEntries.sort((entry_a, entry_b) => {
|
|
88
|
-
return entry_a.month_year_number - entry_b.month_year_number;
|
|
89
|
-
});
|
|
90
|
-
newEntries.reverse();
|
|
91
|
-
let setEntriesFn = () => {
|
|
92
|
-
this.entriesByMonthAndYear = newEntries;
|
|
93
|
-
this.loading = false;
|
|
94
|
-
if (wipe) {
|
|
95
|
-
this.state = 'in';
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
setTimeout(setEntriesFn.bind(this), 400);
|
|
99
|
-
};
|
|
100
|
-
setTimeout(organizeEntriesFn.bind(this), 400);
|
|
101
|
-
}
|
|
102
|
-
getEntries() {
|
|
103
|
-
this.loading = true;
|
|
104
|
-
this.entryService.get().subscribe((response) => {
|
|
105
|
-
this.response = response;
|
|
106
|
-
this.entries = map(response.results, (result) => {
|
|
107
|
-
return { id: result.id, entry: new Entry(result) };
|
|
108
|
-
});
|
|
109
|
-
this.organizeEntries();
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
searchEntries(searchTerm) {
|
|
113
|
-
let turnOnLoading = () => {
|
|
114
|
-
this.loading = true;
|
|
115
|
-
};
|
|
116
|
-
setTimeout(turnOnLoading.bind(this), this.debounceTimeout + 100);
|
|
117
|
-
if (searchTerm !== "") {
|
|
118
|
-
this.entryService.search(searchTerm).subscribe((response) => {
|
|
119
|
-
this.response = response;
|
|
120
|
-
this.entries = map(response.results, (result) => {
|
|
121
|
-
return { id: result.id, entry: new Entry(result) };
|
|
122
|
-
});
|
|
123
|
-
this.organizeEntries();
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
this.getEntries();
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
render() {
|
|
131
|
-
}
|
|
132
|
-
routeTo(entry) {
|
|
133
|
-
if (!entry) {
|
|
134
|
-
this.router.navigateByUrl('create(left-col:create//right-col:create)').then(() => {
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
this.router.navigate(['/', 'blog', entry.slug]).then(() => {
|
|
139
|
-
// Noop
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
getMonthAndYearFromKey(key) {
|
|
144
|
-
let subheading = '';
|
|
145
|
-
const parts = key.split('/');
|
|
146
|
-
switch (Number(parts[0])) {
|
|
147
|
-
case 0:
|
|
148
|
-
subheading += 'January ';
|
|
149
|
-
break;
|
|
150
|
-
case 1:
|
|
151
|
-
subheading += 'February ';
|
|
152
|
-
break;
|
|
153
|
-
case 2:
|
|
154
|
-
subheading += 'March ';
|
|
155
|
-
break;
|
|
156
|
-
case 3:
|
|
157
|
-
subheading += 'April ';
|
|
158
|
-
break;
|
|
159
|
-
case 4:
|
|
160
|
-
subheading += 'May ';
|
|
161
|
-
break;
|
|
162
|
-
case 5:
|
|
163
|
-
subheading += 'June ';
|
|
164
|
-
break;
|
|
165
|
-
case 6:
|
|
166
|
-
subheading += 'July ';
|
|
167
|
-
break;
|
|
168
|
-
case 7:
|
|
169
|
-
subheading += 'August ';
|
|
170
|
-
break;
|
|
171
|
-
case 8:
|
|
172
|
-
subheading += 'September ';
|
|
173
|
-
break;
|
|
174
|
-
case 9:
|
|
175
|
-
subheading += 'October ';
|
|
176
|
-
break;
|
|
177
|
-
case 10:
|
|
178
|
-
subheading += 'November ';
|
|
179
|
-
break;
|
|
180
|
-
case 11:
|
|
181
|
-
subheading += 'December ';
|
|
182
|
-
break;
|
|
183
|
-
default:
|
|
184
|
-
subheading += 'January ';
|
|
185
|
-
}
|
|
186
|
-
subheading += parts[1];
|
|
187
|
-
return subheading;
|
|
188
|
-
}
|
|
189
|
-
ngOnDestroy() {
|
|
190
|
-
if (this.sourceSub) {
|
|
191
|
-
this.sourceSub.unsubscribe();
|
|
192
|
-
this.sourceSub = null;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
onSearchChange(searchValue) {
|
|
196
|
-
this.doSearch.emit(searchValue);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
SideNavigationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: SideNavigationComponent, deps: [{ token: i1.EntryService }, { token: i2.Router }, { token: i3.IdentityService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
|
|
200
|
-
SideNavigationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.4", type: SideNavigationComponent, selector: "app-side-navigation", viewQueries: [{ propertyName: "divNav", first: true, predicate: ["navcontainer"], descendants: true }], ngImport: i0, template: "<div class=\"sidenav no-scrollbar\">\n <div style=\"margin-top: 20px;\">\n <mat-form-field style=\"width: 100%\">\n <mat-label>Search</mat-label>\n <input matInput [formControl]=\"searchControl\" (ngModelChange)=\"onSearchChange($event)\">\n </mat-form-field>\n </div>\n\n <div\n class=\"progress\"\n [hidden]=\"!loading\"\n >\n <mat-progress-spinner\n style=\"margin-left: 16px;\"\n [diameter]=20\n mode=\"indeterminate\"\n >\n </mat-progress-spinner>\n </div>\n\n <div #navcontainer class=\"navcontainer\"\n [@sideNavAnimation]=\"state\"\n >\n <mat-nav-list\n *ngFor=\"let container of entriesByMonthAndYear\"\n >\n <h3>{{getMonthAndYearFromKey(container.month_year)}}</h3>\n <a mat-list-item *ngFor=\"let entry of container.entries\" href=\"javascript:void(0)\" (click)=\"routeTo(entry)\">{{entry.title}}</a>\n </mat-nav-list>\n\n <a\n class=\"sidelink\"\n *ngIf=\"this?.response?.next && !loading\"\n (click)=\"getMore()\"\n href=\"javascript:void(0);\">More...</a>\n </div>\n <ng-container *ngIf=\"identity?.id === 1\">\n <h2>Misc</h2>\n\n <mat-nav-list>\n <a mat-list-item href=\"javascript:void(0);\" (click)=\"routeTo(null)\">Create</a>\n </mat-nav-list>\n </ng-container>\n <h3 *ngIf=\"identity\">Logged in as {{identity?.email}}</h3>\n</div>\n\n", styles: [".progress{position:absolute;top:100px;left:0}.sidelink{padding-left:16px}.sidenav{position:relative;max-height:calc(100vh - 100px)}@media screen and (max-height: 560px){.sidenav{max-height:100vh}}h2,h3{margin-left:10px;justify-content:right}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "component", type: i8.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i8.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "component", type: i9.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }], animations: [
|
|
201
|
-
trigger('sideNavAnimation', [
|
|
202
|
-
state('in', style({ transform: 'translateX(0%)' })),
|
|
203
|
-
state('out', style({ transform: 'translateX(110%)' })),
|
|
204
|
-
transition('in => out', [
|
|
205
|
-
animate('100ms ease-out', style({ transform: 'translateX(110%)' }))
|
|
206
|
-
]),
|
|
207
|
-
transition('out => in', [
|
|
208
|
-
animate('100ms ease-in', style({ transform: 'translateX(0%)' }))
|
|
209
|
-
])
|
|
210
|
-
]),
|
|
211
|
-
] });
|
|
212
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.4", ngImport: i0, type: SideNavigationComponent, decorators: [{
|
|
213
|
-
type: Component,
|
|
214
|
-
args: [{ selector: 'app-side-navigation', animations: [
|
|
215
|
-
trigger('sideNavAnimation', [
|
|
216
|
-
state('in', style({ transform: 'translateX(0%)' })),
|
|
217
|
-
state('out', style({ transform: 'translateX(110%)' })),
|
|
218
|
-
transition('in => out', [
|
|
219
|
-
animate('100ms ease-out', style({ transform: 'translateX(110%)' }))
|
|
220
|
-
]),
|
|
221
|
-
transition('out => in', [
|
|
222
|
-
animate('100ms ease-in', style({ transform: 'translateX(0%)' }))
|
|
223
|
-
])
|
|
224
|
-
]),
|
|
225
|
-
], template: "<div class=\"sidenav no-scrollbar\">\n <div style=\"margin-top: 20px;\">\n <mat-form-field style=\"width: 100%\">\n <mat-label>Search</mat-label>\n <input matInput [formControl]=\"searchControl\" (ngModelChange)=\"onSearchChange($event)\">\n </mat-form-field>\n </div>\n\n <div\n class=\"progress\"\n [hidden]=\"!loading\"\n >\n <mat-progress-spinner\n style=\"margin-left: 16px;\"\n [diameter]=20\n mode=\"indeterminate\"\n >\n </mat-progress-spinner>\n </div>\n\n <div #navcontainer class=\"navcontainer\"\n [@sideNavAnimation]=\"state\"\n >\n <mat-nav-list\n *ngFor=\"let container of entriesByMonthAndYear\"\n >\n <h3>{{getMonthAndYearFromKey(container.month_year)}}</h3>\n <a mat-list-item *ngFor=\"let entry of container.entries\" href=\"javascript:void(0)\" (click)=\"routeTo(entry)\">{{entry.title}}</a>\n </mat-nav-list>\n\n <a\n class=\"sidelink\"\n *ngIf=\"this?.response?.next && !loading\"\n (click)=\"getMore()\"\n href=\"javascript:void(0);\">More...</a>\n </div>\n <ng-container *ngIf=\"identity?.id === 1\">\n <h2>Misc</h2>\n\n <mat-nav-list>\n <a mat-list-item href=\"javascript:void(0);\" (click)=\"routeTo(null)\">Create</a>\n </mat-nav-list>\n </ng-container>\n <h3 *ngIf=\"identity\">Logged in as {{identity?.email}}</h3>\n</div>\n\n", styles: [".progress{position:absolute;top:100px;left:0}.sidelink{padding-left:16px}.sidenav{position:relative;max-height:calc(100vh - 100px)}@media screen and (max-height: 560px){.sidenav{max-height:100vh}}h2,h3{margin-left:10px;justify-content:right}\n"] }]
|
|
226
|
-
}], ctorParameters: function () { return [{ type: i1.EntryService }, { type: i2.Router }, { type: i3.IdentityService }, { type: i0.Renderer2 }]; }, propDecorators: { divNav: [{
|
|
227
|
-
type: ViewChild,
|
|
228
|
-
args: ['navcontainer', { static: false }]
|
|
229
|
-
}] } });
|
|
230
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZS1uYXZpZ2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9jb21wb25lbnRzL3NpZGUtbmF2aWdhdGlvbi9zaWRlLW5hdmlnYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2NvbXBvbmVudHMvc2lkZS1uYXZpZ2F0aW9uL3NpZGUtbmF2aWdhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBeUMsU0FBUyxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFakYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7OztBQXdCdkMsTUFBTSxPQUFPLHVCQUF1QjtJQW9CbEMsWUFDVSxZQUEwQixFQUMxQixNQUFjLEVBQ2QsZUFBZ0MsRUFDaEMsUUFBbUI7UUFIbkIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBdEI3QixVQUFLLEdBQWlCLEtBQUssQ0FBQztRQUs1QixhQUFRLEdBQXdCLElBQUksQ0FBQztRQUNyQyxvQkFBZSxHQUFHLEdBQUcsQ0FBQztRQUN0QixZQUFPLEdBQUcsSUFBSSxDQUFDO1FBRWYsWUFBTyxHQUFpQyxFQUFFLENBQUM7UUFDM0MsMEJBQXFCLEdBQXdFLEVBQUUsQ0FBQztRQUVoRyxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRWhCLGFBQVEsR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQWdNcEQsa0JBQWEsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQXRMcEMsQ0FBQztJQUVELFFBQVE7UUFFTixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDMUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDbEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDM0IsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDUCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUVwQixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsR0FBVyxFQUFFLElBQUksR0FBRyxJQUFJO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ3pELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ2hDLEdBQUcsQ0FBRSxRQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUN4QyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFDLENBQUM7WUFDcEQsQ0FBQyxDQUFDLENBQ0gsQ0FBQztZQUNGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZSxDQUFDLElBQUksR0FBRyxJQUFJO1FBQ3pCLElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7U0FDcEI7UUFDRCxJQUFJLGlCQUFpQixHQUFHLEdBQUcsRUFBRTtZQUMzQixJQUFHLElBQUksRUFBRTtnQkFDUCxJQUFJLENBQUMscUJBQXFCLEdBQUcsRUFBRSxDQUFDO2FBQ2pDO1lBQ0QsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7WUFDeEUsS0FBSyxNQUFNLFlBQVksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUN2QyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO2dCQUNqQyxNQUFNLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ2hELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN2QyxNQUFNLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztnQkFDL0IsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUN4QyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsVUFBVSxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUM3RixJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUN6QixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3ZGLElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7d0JBQzlCLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUMvQjtpQkFDRjtxQkFBTTtvQkFDTCxNQUFNLFlBQVksR0FBRyxFQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUM7b0JBQ3hGLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQy9CO2FBQ0Y7WUFDRCxVQUFVLENBQUMsSUFBSSxDQUNiLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFO2dCQUNuQixPQUFPLE9BQU8sQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7WUFDL0QsQ0FBQyxDQUFDLENBQUM7WUFDTCxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFckIsSUFBSSxZQUFZLEdBQUcsR0FBRyxFQUFFO2dCQUN0QixJQUFJLENBQUMscUJBQXFCLEdBQUcsVUFBVSxDQUFDO2dCQUN4QyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDckIsSUFBSSxJQUFJLEVBQUU7b0JBQ1IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7aUJBQ25CO1lBQ0gsQ0FBQyxDQUFBO1lBQ0QsVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7UUFDMUMsQ0FBQyxDQUFBO1FBQ0QsVUFBVSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDN0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUM5QyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFDLENBQUM7WUFDcEQsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYSxDQUFDLFVBQWtCO1FBRTlCLElBQUksYUFBYSxHQUFHLEdBQUcsRUFBRTtZQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUN0QixDQUFDLENBQUE7UUFDRCxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2pFLElBQUksVUFBVSxLQUFLLEVBQUUsRUFBRTtZQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDMUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDOUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBQyxDQUFDO2dCQUNwRCxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ25CO0lBQ0gsQ0FBQztJQUVELE1BQU07SUFDTixDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQUs7UUFDWCxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBRWpGLENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUN4RCxPQUFPO1lBQ1QsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxHQUFXO1FBQ2hDLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNwQixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTdCLFFBQVEsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3hCLEtBQUssQ0FBQztnQkFDSixVQUFVLElBQUksVUFBVSxDQUFDO2dCQUN6QixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLFVBQVUsSUFBSSxXQUFXLENBQUM7Z0JBQzFCLE1BQU07WUFDUixLQUFLLENBQUM7Z0JBQ0osVUFBVSxJQUFJLFFBQVEsQ0FBQztnQkFDdkIsTUFBTTtZQUNSLEtBQUssQ0FBQztnQkFDSixVQUFVLElBQUksUUFBUSxDQUFDO2dCQUN2QixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLFVBQVUsSUFBSSxNQUFNLENBQUM7Z0JBQ3JCLE1BQU07WUFDUixLQUFLLENBQUM7Z0JBQ0osVUFBVSxJQUFJLE9BQU8sQ0FBQztnQkFDdEIsTUFBTTtZQUNSLEtBQUssQ0FBQztnQkFDSixVQUFVLElBQUksT0FBTyxDQUFDO2dCQUN0QixNQUFNO1lBQ1IsS0FBSyxDQUFDO2dCQUNKLFVBQVUsSUFBSSxTQUFTLENBQUM7Z0JBQ3hCLE1BQU07WUFDUixLQUFLLENBQUM7Z0JBQ0osVUFBVSxJQUFJLFlBQVksQ0FBQztnQkFDM0IsTUFBTTtZQUNSLEtBQUssQ0FBQztnQkFDSixVQUFVLElBQUksVUFBVSxDQUFDO2dCQUN6QixNQUFNO1lBQ1IsS0FBSyxFQUFFO2dCQUNMLFVBQVUsSUFBSSxXQUFXLENBQUM7Z0JBQzFCLE1BQU07WUFDUixLQUFLLEVBQUU7Z0JBQ0wsVUFBVSxJQUFJLFdBQVcsQ0FBQztnQkFDMUIsTUFBTTtZQUNSO2dCQUNFLFVBQVUsSUFBSSxVQUFVLENBQUM7U0FDNUI7UUFDRCxVQUFVLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZCLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDdkI7SUFDSCxDQUFDO0lBSUQsY0FBYyxDQUFDLFdBQW1CO1FBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7O29IQXBOVSx1QkFBdUI7d0dBQXZCLHVCQUF1QixtS0NoQ3BDLGsyQ0E4Q0EsMGtFRDNCYztRQUNWLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRTtZQUMxQixLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLENBQUM7WUFDakQsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUMsQ0FBQyxDQUFDO1lBQ3BELFVBQVUsQ0FBQyxXQUFXLEVBQUU7Z0JBQ3RCLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsRUFBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUMsQ0FBQyxDQUFDO2FBQ2xFLENBQUM7WUFDRixVQUFVLENBQUMsV0FBVyxFQUFFO2dCQUN0QixPQUFPLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLENBQUM7YUFDL0QsQ0FBQztTQUNILENBQUM7S0FDSDsyRkFFVSx1QkFBdUI7a0JBakJuQyxTQUFTOytCQUNFLHFCQUFxQixjQUduQjt3QkFDVixPQUFPLENBQUMsa0JBQWtCLEVBQUU7NEJBQzFCLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFDLENBQUMsQ0FBQzs0QkFDakQsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUMsQ0FBQyxDQUFDOzRCQUNwRCxVQUFVLENBQUMsV0FBVyxFQUFFO2dDQUN0QixPQUFPLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLEVBQUMsU0FBUyxFQUFFLGtCQUFrQixFQUFDLENBQUMsQ0FBQzs2QkFDbEUsQ0FBQzs0QkFDRixVQUFVLENBQUMsV0FBVyxFQUFFO2dDQUN0QixPQUFPLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLENBQUM7NkJBQy9ELENBQUM7eUJBQ0gsQ0FBQztxQkFDSDs4S0FvQjZDLE1BQU07c0JBQW5ELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgUmVuZGVyZXIyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRyaWdnZXIsIHN0YXRlLCBzdHlsZSwgYW5pbWF0ZSwgdHJhbnNpdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHtSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHttYXB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge2RlYm91bmNlVGltZX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge0VudHJ5fSBmcm9tICcuLi8uLi9kYXRhL2VudHJ5JztcbmltcG9ydCB7SWRlbnRpdHl9IGZyb20gJy4uLy4uL2RhdGEvaWRlbnRpdHknO1xuaW1wb3J0IHtMaXN0UmVzcG9uc2V9IGZyb20gJy4uLy4uL2RhdGEvbGlzdC1yZXNwb25zZSc7XG5cbmltcG9ydCB7RW50cnlTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lbnRyeS5zZXJ2aWNlJztcbmltcG9ydCB7SWRlbnRpdHlTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pZGVudGl0eS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXNpZGUtbmF2aWdhdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaWRlLW5hdmlnYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zaWRlLW5hdmlnYXRpb24uY29tcG9uZW50LnNjc3MnXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ3NpZGVOYXZBbmltYXRpb24nLCBbXG4gICAgICBzdGF0ZSgnaW4nLCBzdHlsZSh7dHJhbnNmb3JtOiAndHJhbnNsYXRlWCgwJSknfSkpLFxuICAgICAgc3RhdGUoJ291dCcsIHN0eWxlKHt0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDExMCUpJ30pKSxcbiAgICAgIHRyYW5zaXRpb24oJ2luID0+IG91dCcsIFtcbiAgICAgICAgYW5pbWF0ZSgnMTAwbXMgZWFzZS1vdXQnLCBzdHlsZSh7dHJhbnNmb3JtOiAndHJhbnNsYXRlWCgxMTAlKSd9KSlcbiAgICAgIF0pLFxuICAgICAgdHJhbnNpdGlvbignb3V0ID0+IGluJywgW1xuICAgICAgICBhbmltYXRlKCcxMDBtcyBlYXNlLWluJywgc3R5bGUoe3RyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMCUpJ30pKVxuICAgICAgXSlcbiAgICBdKSxcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTaWRlTmF2aWdhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBzdGF0ZTogJ2luJyB8ICdvdXQnID0gJ291dCc7XG5cbiAgc291cmNlU3ViO1xuICBpZGVudGl0eTogSWRlbnRpdHk7XG5cbiAgcmVzcG9uc2U6IExpc3RSZXNwb25zZTxFbnRyeT4gPSBudWxsO1xuICBkZWJvdW5jZVRpbWVvdXQgPSAyMDA7XG4gIGxvYWRpbmcgPSB0cnVlO1xuXG4gIGVudHJpZXM6IHtpZDogc3RyaW5nLCBlbnRyeTogRW50cnl9W10gPSBbXTtcbiAgZW50cmllc0J5TW9udGhBbmRZZWFyOiB7bW9udGhfeWVhcjogc3RyaW5nLCBtb250aF95ZWFyX251bWJlcjogbnVtYmVyLCBlbnRyaWVzOiBFbnRyeVtdfVtdID0gW107XG5cbiAgc2VhcmNoVGVybSA9IFwiXCI7XG5cbiAgZG9TZWFyY2g6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ25hdmNvbnRhaW5lcicsIHsgc3RhdGljOiBmYWxzZSB9KSBkaXZOYXY6IEVsZW1lbnRSZWY7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbnRyeVNlcnZpY2U6IEVudHJ5U2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgaWRlbnRpdHlTZXJ2aWNlOiBJZGVudGl0eVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICApIHtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuXG4gICAgdGhpcy5kb1NlYXJjaC5waXBlKGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZW91dCkpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICB0aGlzLnNlYXJjaEVudHJpZXMocmVzdWx0KTtcbiAgICB9KTtcblxuICAgIHRoaXMuaWRlbnRpdHlTZXJ2aWNlLmdldE1lKCkuc3Vic2NyaWJlKChpZGVudGl0eSkgPT4ge1xuICAgICAgdGhpcy5pZGVudGl0eSA9IGlkZW50aXR5O1xuICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5pZGVudGl0eSA9IG51bGw7XG4gICAgICB9KTtcblxuICAgIHRoaXMuZ2V0RW50cmllcygpO1xuXG4gIH1cblxuICBnZXRNb3JlKCkge1xuICAgIHRoaXMuZ2V0RW50cmllc1dpdGhVcmwodGhpcy5yZXNwb25zZS5uZXh0LCBmYWxzZSk7XG4gIH1cblxuICBnZXRFbnRyaWVzV2l0aFVybCh1cmw6IHN0cmluZywgd2lwZSA9IHRydWUpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZW50cnlTZXJ2aWNlLmdldExpc3RCeVVybCh1cmwpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgIHRoaXMuZW50cmllcyA9IHRoaXMuZW50cmllcy5jb25jYXQoXG4gICAgICAgIG1hcCgocmVzcG9uc2UgYXMgYW55KS5yZXN1bHRzLCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHsgaWQ6IHJlc3VsdC5pZCwgZW50cnk6IG5ldyBFbnRyeShyZXN1bHQpfTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLm9yZ2FuaXplRW50cmllcyh3aXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9yZ2FuaXplRW50cmllcyh3aXBlID0gdHJ1ZSkge1xuICAgIGlmICh3aXBlKSB7XG4gICAgICB0aGlzLnN0YXRlID0gJ291dCc7XG4gICAgfVxuICAgIGxldCBvcmdhbml6ZUVudHJpZXNGbiA9ICgpID0+IHtcbiAgICAgIGlmKHdpcGUpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzQnlNb250aEFuZFllYXIgPSBbXTtcbiAgICAgIH1cbiAgICAgIGxldCBuZXdFbnRyaWVzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmVudHJpZXNCeU1vbnRoQW5kWWVhcikpO1xuICAgICAgZm9yIChjb25zdCBlbnRyeVdyYXBwZXIgb2YgdGhpcy5lbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cnlXcmFwcGVyLmVudHJ5O1xuICAgICAgICBjb25zdCBjcmVhdGVfZGF0ZSA9IG5ldyBEYXRlKGVudHJ5LmNyZWF0ZV9kYXRlKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBjcmVhdGVfZGF0ZS5nZXRNb250aCgpO1xuICAgICAgICBjb25zdCB5ZWFyID0gY3JlYXRlX2RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgY29uc3Qga2V5ID0gbW9udGggKyAnLycgKyB5ZWFyO1xuICAgICAgICBjb25zdCBzb3J0X2luZGV4ID0gKHllYXIgKiAxMDApICsgbW9udGg7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBmaWx0ZXIobmV3RW50cmllcywgKGVudHJ5Q29udGFpbmVyKSA9PiBlbnRyeUNvbnRhaW5lci5tb250aF95ZWFyID09PSBrZXkpO1xuICAgICAgICBpZiAoY29udGFpbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgY29udGFpbmVyID0gY29udGFpbmVyc1swXTtcbiAgICAgICAgICBjb25zdCBlbnRyaWVzV2l0aElkID0gZmlsdGVyKGNvbnRhaW5lci5lbnRyaWVzLCAoZSkgPT4gZS5pZCA9PT0gZW50cnlXcmFwcGVyLmVudHJ5LmlkKTtcbiAgICAgICAgICBpZiAoZW50cmllc1dpdGhJZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnRhaW5lci5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBuZXdDb250YWluZXIgPSB7bW9udGhfeWVhcjoga2V5LCBtb250aF95ZWFyX251bWJlcjogc29ydF9pbmRleCwgZW50cmllczogW2VudHJ5XX07XG4gICAgICAgICAgbmV3RW50cmllcy5wdXNoKG5ld0NvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5ld0VudHJpZXMuc29ydChcbiAgICAgICAgKGVudHJ5X2EsIGVudHJ5X2IpID0+IHtcbiAgICAgICAgICByZXR1cm4gZW50cnlfYS5tb250aF95ZWFyX251bWJlciAtIGVudHJ5X2IubW9udGhfeWVhcl9udW1iZXI7XG4gICAgICAgIH0pO1xuICAgICAgbmV3RW50cmllcy5yZXZlcnNlKCk7XG5cbiAgICAgIGxldCBzZXRFbnRyaWVzRm4gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuZW50cmllc0J5TW9udGhBbmRZZWFyID0gbmV3RW50cmllcztcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmICh3aXBlKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9ICdpbic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldFRpbWVvdXQoc2V0RW50cmllc0ZuLmJpbmQodGhpcyksIDQwMClcbiAgICB9XG4gICAgc2V0VGltZW91dChvcmdhbml6ZUVudHJpZXNGbi5iaW5kKHRoaXMpLCA0MDApXG4gIH1cblxuICBnZXRFbnRyaWVzKCkge1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5lbnRyeVNlcnZpY2UuZ2V0KCkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgdGhpcy5lbnRyaWVzID0gbWFwKHJlc3BvbnNlLnJlc3VsdHMsIChyZXN1bHQpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgaWQ6IHJlc3VsdC5pZCwgZW50cnk6IG5ldyBFbnRyeShyZXN1bHQpfTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vcmdhbml6ZUVudHJpZXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHNlYXJjaEVudHJpZXMoc2VhcmNoVGVybTogc3RyaW5nKSB7XG5cbiAgICBsZXQgdHVybk9uTG9hZGluZyA9ICgpID0+IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgfVxuICAgIHNldFRpbWVvdXQodHVybk9uTG9hZGluZy5iaW5kKHRoaXMpLCB0aGlzLmRlYm91bmNlVGltZW91dCArIDEwMCk7XG4gICAgaWYgKHNlYXJjaFRlcm0gIT09IFwiXCIpIHtcbiAgICAgIHRoaXMuZW50cnlTZXJ2aWNlLnNlYXJjaChzZWFyY2hUZXJtKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0gbWFwKHJlc3BvbnNlLnJlc3VsdHMsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICByZXR1cm4geyBpZDogcmVzdWx0LmlkLCBlbnRyeTogbmV3IEVudHJ5KHJlc3VsdCl9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vcmdhbml6ZUVudHJpZXMoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdldEVudHJpZXMoKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gIH1cblxuICByb3V0ZVRvKGVudHJ5KSB7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnY3JlYXRlKGxlZnQtY29sOmNyZWF0ZS8vcmlnaHQtY29sOmNyZWF0ZSknKS50aGVuKCgpID0+IHtcblxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLycsICdibG9nJywgZW50cnkuc2x1Z10pLnRoZW4oKCkgPT4ge1xuICAgICAgICAvLyBOb29wXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRNb250aEFuZFllYXJGcm9tS2V5KGtleTogc3RyaW5nKSB7XG4gICAgbGV0IHN1YmhlYWRpbmcgPSAnJztcbiAgICBjb25zdCBwYXJ0cyA9IGtleS5zcGxpdCgnLycpO1xuXG4gICAgc3dpdGNoIChOdW1iZXIocGFydHNbMF0pKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHN1YmhlYWRpbmcgKz0gJ0phbnVhcnkgJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHN1YmhlYWRpbmcgKz0gJ0ZlYnJ1YXJ5ICc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBzdWJoZWFkaW5nICs9ICdNYXJjaCAnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgc3ViaGVhZGluZyArPSAnQXByaWwgJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHN1YmhlYWRpbmcgKz0gJ01heSAnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNTpcbiAgICAgICAgc3ViaGVhZGluZyArPSAnSnVuZSAnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjpcbiAgICAgICAgc3ViaGVhZGluZyArPSAnSnVseSAnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNzpcbiAgICAgICAgc3ViaGVhZGluZyArPSAnQXVndXN0ICc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA4OlxuICAgICAgICBzdWJoZWFkaW5nICs9ICdTZXB0ZW1iZXIgJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDk6XG4gICAgICAgIHN1YmhlYWRpbmcgKz0gJ09jdG9iZXIgJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEwOlxuICAgICAgICBzdWJoZWFkaW5nICs9ICdOb3ZlbWJlciAnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTE6XG4gICAgICAgIHN1YmhlYWRpbmcgKz0gJ0RlY2VtYmVyICc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc3ViaGVhZGluZyArPSAnSmFudWFyeSAnO1xuICAgIH1cbiAgICBzdWJoZWFkaW5nICs9IHBhcnRzWzFdO1xuXG4gICAgcmV0dXJuIHN1YmhlYWRpbmc7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zb3VyY2VTdWIpIHtcbiAgICAgIHRoaXMuc291cmNlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnNvdXJjZVN1YiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgc2VhcmNoQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG5cbiAgb25TZWFyY2hDaGFuZ2Uoc2VhcmNoVmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZG9TZWFyY2guZW1pdChzZWFyY2hWYWx1ZSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzaWRlbmF2IG5vLXNjcm9sbGJhclwiPlxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMjBweDtcIj5cbiAgICA8bWF0LWZvcm0tZmllbGQgc3R5bGU9XCJ3aWR0aDogMTAwJVwiPlxuICAgICAgPG1hdC1sYWJlbD5TZWFyY2g8L21hdC1sYWJlbD5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwic2VhcmNoQ29udHJvbFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKCRldmVudClcIj5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJwcm9ncmVzc1wiXG4gICAgW2hpZGRlbl09XCIhbG9hZGluZ1wiXG4gID5cbiAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXJcbiAgICAgIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDE2cHg7XCJcbiAgICAgIFtkaWFtZXRlcl09MjBcbiAgICAgIG1vZGU9XCJpbmRldGVybWluYXRlXCJcbiAgICA+XG4gICAgPC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAjbmF2Y29udGFpbmVyIGNsYXNzPVwibmF2Y29udGFpbmVyXCJcbiAgICBbQHNpZGVOYXZBbmltYXRpb25dPVwic3RhdGVcIlxuICA+XG4gICAgPG1hdC1uYXYtbGlzdFxuICAgICAgKm5nRm9yPVwibGV0IGNvbnRhaW5lciBvZiBlbnRyaWVzQnlNb250aEFuZFllYXJcIlxuICAgID5cbiAgICAgIDxoMz57e2dldE1vbnRoQW5kWWVhckZyb21LZXkoY29udGFpbmVyLm1vbnRoX3llYXIpfX08L2gzPlxuICAgICAgPGEgbWF0LWxpc3QtaXRlbSAqbmdGb3I9XCJsZXQgZW50cnkgb2YgY29udGFpbmVyLmVudHJpZXNcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgKGNsaWNrKT1cInJvdXRlVG8oZW50cnkpXCI+e3tlbnRyeS50aXRsZX19PC9hPlxuICAgIDwvbWF0LW5hdi1saXN0PlxuXG4gICAgPGFcbiAgICAgIGNsYXNzPVwic2lkZWxpbmtcIlxuICAgICAgKm5nSWY9XCJ0aGlzPy5yZXNwb25zZT8ubmV4dCAmJiAhbG9hZGluZ1wiXG4gICAgICAoY2xpY2spPVwiZ2V0TW9yZSgpXCJcbiAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCI+TW9yZS4uLjwvYT5cbiAgPC9kaXY+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJpZGVudGl0eT8uaWQgPT09IDFcIj5cbiAgICA8aDI+TWlzYzwvaDI+XG5cbiAgICA8bWF0LW5hdi1saXN0PlxuICAgICAgPGEgbWF0LWxpc3QtaXRlbSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiIChjbGljayk9XCJyb3V0ZVRvKG51bGwpXCI+Q3JlYXRlPC9hPlxuICAgIDwvbWF0LW5hdi1saXN0PlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPGgzICpuZ0lmPVwiaWRlbnRpdHlcIj5Mb2dnZWQgaW4gYXMge3tpZGVudGl0eT8uZW1haWx9fTwvaDM+XG48L2Rpdj5cblxuIl19
|